home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / MLT_TASK / MULTIP / MULTI.PAS < prev   
Pascal/Delphi Source File  |  1994-07-19  |  3KB  |  98 lines

  1. Unit Multi;
  2. {--------------------------------------------------------------------------------}
  3. {                                                                                }
  4. { Hilfsfunktionen zur quasi-Multitaskingverarbeitung unter Turbo Pascal          }
  5. {                                                                                }
  6. { (c) 1994 by Hegel Udo                                                          }
  7. {                                                                                }
  8. {--------------------------------------------------------------------------------}
  9. Interface
  10. {--------------------------------------------------------------------------------}
  11. Type
  12.   StartProc = Procedure;
  13. {--------------------------------------------------------------------------------}
  14. Procedure AddTask (Start : StartProc;StackSize : Word);
  15. Procedure Transfer;
  16. {--------------------------------------------------------------------------------}
  17. Implementation
  18. {--------------------------------------------------------------------------------}
  19. Uses
  20.   Dos;
  21. {--------------------------------------------------------------------------------}
  22. Type
  23.   TaskPtr   = ^TaskRec;
  24.   TaskRec   = Record
  25.     StackSize : Word;
  26.     Stack     : Pointer;
  27.     SPSave    : Word;
  28.     SSSave    : Word;
  29.     BPSave    : Word;
  30.     Next      : TaskPtr;
  31.   end;
  32. {--------------------------------------------------------------------------------}
  33. Const
  34.   MinStack = 1024;
  35.   MaxStack = 32768;
  36. {--------------------------------------------------------------------------------}
  37. Var
  38.   Tasks    : TaskPtr;
  39.   AktTask  : TaskPtr;
  40.   OldExit  : Pointer;
  41. {--------------------------------------------------------------------------------}
  42. Procedure AddTask (Start : StartProc;StackSize : Word);
  43. Type
  44.   OS = Record
  45.     O,S : Word;
  46.   end;
  47. Var
  48.   W  : ^TaskPtr;
  49.   SS : Word;
  50.   SP : Word;
  51. begin
  52.   W := @Tasks;
  53.   While Assigned (W^) do W := @W^^.Next;
  54.   New (W^);
  55.   if StackSize < MinStack then StackSize := MinStack;
  56.   if StackSize > MaxStack then StackSize := MaxStack;
  57.   W^^.StackSize := StackSize;
  58.   GetMem (W^^.Stack,StackSize);
  59.   SS := OS(W^^.Stack).S;
  60.   SP := OS(W^^.Stack).O+StackSize-4;
  61.   Move (Start,Ptr(SS,SP)^,4);
  62.   W^^.SPSave := SP;
  63.   W^^.SSSave := SS;
  64.   W^^.BPSave := W^^.SPSave;
  65.   W^^.Next := NIL;
  66. end;
  67. {--------------------------------------------------------------------------------}
  68. Procedure Transfer; Assembler;
  69. Asm
  70.   LES SI,AktTask                               { Alter Status sichern }
  71.   MOV ES:[SI].TaskRec.SPSave,SP
  72.   MOV ES:[SI].TaskRec.SSSave,SS
  73.   MOV ES:[SI].TaskRec.BPSave,BP
  74.   MOV AX,Word Ptr ES:[SI].TaskRec.Next         { Neue Task bestimmen }
  75.   OR  AX,Word Ptr ES:[SI].TaskRec.Next+2
  76.   JE  @InitNew
  77.   LES SI,ES:[SI].TaskRec.Next
  78.   JMP @DoJob
  79. @InitNew:
  80.   LES SI,Tasks
  81. @DoJob:
  82.   MOV Word Ptr AktTask,SI                      { Neue Task Sichern }
  83.   MOV Word Ptr AktTask+2,ES
  84.   CLI                                          { Status wieder hertstellen }
  85.   MOV SP,ES:[SI].TaskRec.SPSave
  86.   MOV SS,ES:[SI].TaskRec.SSSave
  87.   STI
  88.   MOV BP,ES:[SI].TaskRec.BPSave
  89. end;
  90. {--------------------------------------------------------------------------------}
  91. BEGIN
  92.   New (Tasks);              { Hauptprogramm als Task anmelden }
  93.   Tasks^.StackSize := 0;
  94.   Tasks^.Stack := NIL;
  95.   Tasks^.Next := NIL;
  96.   AktTask := Tasks;
  97. END.
  98.